#ifndef EMPTYBOTTLEDETECTOR_H
#define EMPTYBOTTLEDETECTOR_H

#include <QPointF>
#include <QList>
#include "lowpassfilter.h"

class EmptyBottleDetector
{
public:
    EmptyBottleDetector();
    ~EmptyBottleDetector();

    void setEnable(bool en);
    bool isEnable(void) const;

    void setReStart(bool en = true);

    void addData(const double data);
    bool detect();

    double getStatus() const;

    void clear();

    void setPressureThreshold(double pressureLow_kPa, double pressureHigh_kPa = 0);
    void getPressureThreshold(double &pressureLow, double &pressureHigh);

    void setMaskTime(int second);
    int getMaskTime();

    QPointF        getCurrent() const;
    QPointF        getMax() const;
    QPointF        getDelta() const;
    QPointF        getDelta2() const;
    QPointF        getPeriodCnt() const;

    QList<QPointF> getMaxBuffer() const;
    QList<QPointF> getDeltaBuffer() const;
    QList<QPointF> getDelta2Buffer() const;
    QList<QPointF> getPeriodCntBuffer() const;

    void print();

protected:

    bool                m_isEnable = false;

    /**
     * @brief m_pressureThresholdLow 最小压力阈值,单位kPa
     * @brief m_pressureThresholdHigh 最大压力阈值,单位kPa
     * 对于洁瑞普通输液管，输完吊瓶到滴壶之间的水大约压力下降2kPa，大约分成13段（即13个周期）
     */
    double              m_pressureThresholdLow = -2.0; //
    double              m_pressureThresholdHigh = -2.0 / 13; //

    /**
     * @brief m_maskTime 屏蔽时间（单位s），从开始到真正检测需要屏蔽一段时间，这段时间不做检测
     */
    int                 m_maskTime = 10 * 60;
    bool                m_isRestart = true;
    int                 m_restartCnt = 20 * 30; // 30s

    /**
     * @brief m_max 一个周期内的最大值
     */
    QPointF             m_max;
    QPointF             m_current;

    int                 m_status = 0;

    int                 m_cnt = 0; // 总点数
    int                 m_periodCnt = 0; // 总圈数
    int                 m_cntInPeriod = 0; // 每圈的点数

    LowPassFilter<double> *m_filter;
    QList<QPointF>      m_maxBuffer; // 每圈的最大值缓冲区
    QList<QPointF>      m_deltaBuffer; // 最大值差分缓冲区
    QList<QPointF>      m_delta2Buffer; // 二阶差分缓冲区
    QList<QPointF>      m_periodCntBuffer; // 每圈的总点数缓冲区
};

#endif // EMPTYBOTTLEDETECTOR_H
